import jwt
from jwt import PyJWTError

from comment.utils import const
from flask import current_app
from comment.models.user import User
from datetime import datetime,timedelta
def generate_tokens(uid):
    """
    根据已经登陆之后的用户id，生成token
    :param uid: 用户id
    :return:
    """
    payload = {
        'id':uid,
        #exp代表token的有效时间，而且必须是格林尼治时间标准时间值，转换为毫秒的
        'exp':datetime.utcnow() + timedelta(seconds=const.JWT_EXPIRY_SECOND)
    }
    # 参数一：payload是一个字典包括用户加密的id和有效时间，参数2：密钥，参数3：算法
    s = jwt.encode(payload=payload,key=const.SECRET_KEY,algorithm='HS256')
    # 生成token
    return s


def verify_tokens(token_str):
    """
    验证token，并且验证成功之后，返回用户的id
    :param token_str:
    :return:
    """
    try:
        data = jwt.decode(token_str,key=const.SECRET_KEY, algorithms='HS256')
        current_app.logger.info(data)
    except PyJWTError as e:
        current_app.logger.info(e)
        return {'message':'token 验证失败'}

    # 如果token验证成功，还需要看当前用户状态是否在正常
    user =User.query.filter(User.id == data['id']).first()
    if user and user.status!=0:
        return {'message':'数据库中的用户状态过期'}

    return {'id':user.id}



